package com.patrick.open.api.core.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.patrick.open.api.core.common.OpenTkMap;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.context.annotation.Lazy;

import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.List;

/**
 * @author GP
 * @date 2019/10/17 10:59 AM
 */
@Lazy
@Mapper
public interface Db extends BaseMapper{
	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return 查询结果
	 */
	List<OpenTkMap> queryByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return 查询结果
	 */
	List<OpenTkMap> query(@Param("sql") String sql);

	/**
	 * 查询，并返回符合条件的第一条记录
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return 查询结果
	 */
	OpenTkMap queryFirstByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询，并返回符合条件的第一条记录
	 *
	 * @param sql 查询语句
	 * @return 查询结果
	 */
	OpenTkMap queryFirst(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return String
	 */
	String queryStrByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/* *
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return String
	 */
	String queryStr(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return Integer
	 */
	Integer queryIntByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return Integer
	 */
	Integer queryInt(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return Long
	 */
	Long queryLongByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return Long
	 */
	Long queryLong(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return Double
	 */
	Double queryDoubleByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return Double
	 */
	Double queryDouble(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return Float
	 */
	Float queryFloatByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return Float
	 */
	Float queryFloat(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return BigDecimal
	 */
	BigDecimal queryBigDecimalByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return BigDecimal
	 */
	BigDecimal queryBigDecimal(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return byte[]
	 */
	Object queryBytesByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return byte[]
	 */
	Object queryBytes(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return Date
	 */
	Date queryDateByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return Date
	 */
	Date queryDate(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return Time
	 */
	Time queryTimeByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return Time
	 */
	Time queryTime(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return Timestamp
	 */
	Timestamp queryTimestampByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return Timestamp
	 */
	Timestamp queryTimestamp(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return Boolean
	 */
	Boolean queryBooleanByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return Boolean
	 */
	Boolean queryBoolean(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return Short
	 */
	Short queryShortByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return Short
	 */
	Short queryShort(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return Number
	 */
	Number queryNumberByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return Number
	 */
	Number queryNumber(@Param("sql") String sql);

	/**
	 * 插入
	 *
	 * @param sql   插入语句
	 * @param paras 参数值
	 * @return 插入的记录数
	 */
	int insertByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 插入
	 *
	 * @param sql 插入语句
	 * @return 插入的记录数
	 */
	int insert(@Param("sql") String sql);

	/**
	 * 更新
	 *
	 * @param sql   更新语句
	 * @param paras 参数值
	 * @return 更新记录数
	 */
	int updateByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 更新
	 *
	 * @param sql 更新语句
	 * @return 更新记录数
	 */
	int update(@Param("sql") String sql);

	/**
	 * 删除
	 *
	 * @param sql   删除语句
	 * @param paras 参数值
	 * @return 删除的记录数
	 */
	int deleteByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 删除
	 *
	 * @param sql 删除语句
	 * @return 删除的记录数
	 */
	int delete(@Param("sql") String sql);

	/**
	 * 查询
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return 查询的结果
	 */
	List<OpenTkMap> findByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询
	 *
	 * @param sql 查询语句
	 * @return 查询的结果
	 */
	List<OpenTkMap> find(@Param("sql") String sql);

	/**
	 * 查询，并返回符合条件的第一条记录
	 *
	 * @param sql   查询语句
	 * @param paras 参数值
	 * @return 查询的结果
	 */
	OpenTkMap findFirstByParas(@Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 * 查询，并返回符合条件的第一条记录
	 *
	 * @param sql 查询语句
	 * @return 查询的结果
	 */
	OpenTkMap findFirst(@Param("sql") String sql);

	/**
	 * 根据主键(Id)查询记录
	 *
	 * @param tableName 数据库表名
	 * @param idValue   主键值
	 * @return 查询的结果
	 */
	OpenTkMap findById(@Param("tableName") String tableName, @Param("idValue") Object idValue);

	/**
	 * 根据主键查询记录
	 *
	 * @param tableName  数据库表名
	 * @param primaryKey 主键名称
	 * @param idValue    主键值
	 * @return 查询的结果
	 */
	OpenTkMap findByPrimaryKey(@Param("tableName") String tableName, @Param("primaryKey") String primaryKey, @Param("idValue") Object idValue);

	/**
	 * 根据主键(Id)删除记录
	 *
	 * @param tableName 数据库表名
	 * @param idValue   主键值
	 * @return 删除的结果
	 */
	int deleteById(@Param("tableName") String tableName, @Param("idValue") Object idValue);

	/**
	 * 根据主键删除记录
	 *
	 * @param tableName  数据库表名
	 * @param primaryKey 主键名称
	 * @param idValue    主键值
	 * @return 删除的结果
	 */
	int deleteByPrimaryKey(@Param("tableName") String tableName, @Param("primaryKey") String primaryKey, @Param("idValue") Object idValue);

	/**
	 * 分页查询 带参数
	 * @param page
	 * @param wrapper
	 * @param sql
	 * @param paras
	 * @return
	 */
	IPage<OpenTkMap> paginateByParas(Page page, @Param(Constants.WRAPPER) Wrapper wrapper, @Param("sql") String sql, @Param("paras") Object... paras);

	/**
	 *
	 * 分页查询
	 * @param page
	 * @param wrapper
	 * @param sql
	 * @return
	 */
	IPage<OpenTkMap> paginate(Page page, @Param(Constants.WRAPPER) Wrapper wrapper, @Param("sql") String sql);

}
